package com.xuzimian.java.learning.common.algorithm;

import java.util.Random;
import org.junit.jupiter.api.Test;

public class RandomAlgorithm {


    @Test
    public void testChoose() {
        // 四个随机概率，分别是50%，25%，20%,5%
        float[] props = new float[]{0.5f, 0.25f, 0.2f, 0.05f};
        // 统计4个概率下分别被随机选中的次数
        int[] countList = new int[]{0, 0, 0, 0};

        for (int i = 0; i < 10000; i++) {
            int index = Choose(props);
            countList[index] += 1;
        }

        // 输出四个随机概率在10000次下分别被选中的次数，确定是否基本符合被设定的概率
        for (int count : countList) {
            System.out.println("count:" + count);
        }
    }

    /**
     * 返回具有指定概率的随机项。
     * <p>
     * 例如，NPC 在遇到玩家时可能会以几种不同的方式做出反应：
     * - 友好问候的几率为 50%
     * - 逃跑的几率为 25%
     * - 立即攻击的几率为 20%
     * - 提供金钱作为礼物的几率为 5%
     *
     * @param probs
     * @return
     */
    public int Choose(float[] probs) {

        var total = 0f;

        for (float elem : probs) {
            total += elem;
        }


        float random = new Random().nextFloat();

        var randomPoint = random * total;

        System.out.println("randomPoint: " + randomPoint);

        for (int i = 0; i < probs.length; i++) {
            if (randomPoint <= probs[i]) {
                return i;
            } else {
                randomPoint -= probs[i];
            }
        }

        System.out.println("------");
        return (probs.length - 1);
    }
}
